`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date:    16:59:06 11/02/2012 
// Design Name: 
// Module Name:    DOWNSHIFT_UNIT 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: 
//
// Dependencies: 
//
// Revision: 
// Revision 0.01 - File Created
// Additional Comments: 
//
//////////////////////////////////////////////////////////////////////////////////
module DOWNSHIFT_BLOCK #(parameter STEP=34, LOG_LEN=7, LEN=96, WIDTH=16, OFFSET=0)
(
	input clk,
	input rst,
	input signed[WIDTH-1:0] in_data,
	output signed[WIDTH-1:0] out_r,
	output signed[WIDTH-1:0] out_i
    );
	 
	 wire [LOG_LEN-1:0] addr_cos;
	 wire [LOG_LEN-1:0] addr_sin;
	 wire signed[WIDTH-1:0] data_cos;
	 wire signed[WIDTH-1:0] data_sin;
	 wire signed[WIDTH+WIDTH-1:0] tmp_out_r;
	 wire signed[WIDTH+WIDTH-1:0] tmp_out_i;
	 
	 
	 SIN_ROM U_sin(
	 .clka(clk),
	 .addra(addr_sin),
	 .douta(data_sin)
	 );


	SIN_COS_ROM U_cos(
	 .clka(clk),
	 .addra(addr_cos),
	 .douta(data_cos)
	 );
	 
	 
	 DOWNSHIFT_ROM_CTR #(STEP, LOG_LEN, LEN, WIDTH, OFFSET) U_rom_ctr(
	 .clk(clk),
	 .rst(rst),
	 .in_data(in_data),
	 .in_cos(data_cos),
	 .in_sin(data_sin),
    .addr_cos(addr_cos),
    .addr_sin(addr_sin),
	 .out_r(tmp_out_r),
    .out_i(tmp_out_i)
	 );
	 
	 
	 SCALE_UNIT #(WIDTH+WIDTH, WIDTH, WIDTH) U_scale_r(
	 .clk(clk),
	 .rst(rst),
	 .data_in(tmp_out_r),
	 .data_out(out_r)
	 );
	 
	 
	 SCALE_UNIT #(WIDTH+WIDTH, WIDTH, WIDTH) U_scale_i(
	 .clk(clk),
	 .rst(rst),
	 .data_in(tmp_out_i),
	 .data_out(out_i)
	 );


endmodule
